//
//  Tool.m
//  天利娱乐算法
//
//  Created by MC on 2017/6/5.
//  Copyright © 2017年 MC. All rights reserved.
//

#import "Tool.h"
#import "MCMathUnits.h"
@implementation Tool
/*
 * n!阶乘
 */
+(double)Factorial:(int)n{
    double result=1;
    for (int i=1 ;i<=n;i++) {
        result*=i;
    }
    
    return result;
}

/*
 * A(m,n) 排列
 */
+(double)ACombinationWithN:(int)n andM:(int)m{
    double result=1;
    result=[Tool Factorial:n]/[Tool Factorial:(n-m)];
    return result;
}

/*
 * C(m,n) 组合
 */
+(double)CCombinationWithN:(int)n andM:(int)m{
    double result=1;
    result=[Tool Factorial:n]/([Tool Factorial:(n-m)]*[Tool Factorial:m]);
    return result;
}

/*
 * 获取一个随机整数范围在：[start,end]包括start，包括end
 * 传入生成随机数的范围，起始值和结束值
 * 数组里面的数字有可能重复
 */

+(NSArray *)GetRandomArrWithStart:(int)start End:(int)end AndLength:(int)length{
    
    NSMutableArray * marr=[[NSMutableArray alloc]init];
    for(int i=1;i<=length;i++){
        int num=[Tool GetRandomNumber:start to:end];
        [marr addObject:@(num)];
        
    }
    return marr;
    
}

/*
 * 获取一个随机整数，范围在[from,to]，包括from，包括to
 */
+(int)GetRandomNumber:(int)from to:(int)to
{
    return (int)(from + (arc4random() % (to - from + 1)));
}

/*
 * 获取一个随机整数范围在：[start,end]包括start，包括end
 * 传入生成随机数的范围，起始值和结束值
 * 数组里面的数字不重复
 */
+(NSArray *)GetRandomDifArrWithStart:(int)start End:(int)end AndLength:(int)length{
    NSMutableArray * marr=[[NSMutableArray alloc]init];
    for(int i=1;i<=length;i++){
        //        NSLog(@"-------%@",marr);
        
        while (1) {
            int num=[Tool GetRandomNumber:start to:end];
            
            if ([Tool isHaveSameNum:num inArr:marr]) {
                
            }else{
                [marr addObject:[NSNumber numberWithInt:num]];
                break;
            }
        }
        
    }
    return marr;
    
}

/*
 * 比对当前数字在数组里有没有相同的
 */
+(BOOL)isHaveSameNum:(int)num inArr:(NSArray *)arr{
    NSNumber *numm=[NSNumber numberWithInt:num];
    for(NSNumber *num in arr) {
        if ([numm isEqualToNumber:num]) {
            return YES;
        }
    }
    return NO;
}
/*
 * 获取两个数组中相同数字的个数
 */
+(int)GetSameNuminFirestArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr{
    int count=0;
    for (NSNumber * num1 in firstArr) {
        for (NSNumber * num2 in secondArr) {
            if ([num1 isEqualToNumber:num2]) {
                count++;
            }
        }
    }
    return count;
}
/*
 * 获取三个数组中相同数字的个数
 */
+(int)GetSameNuminFirestArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr andThirdArr:(NSArray *)thirdArr{
    int count=0;
    for (NSNumber * num1 in firstArr) {
        for (NSNumber * num2 in secondArr) {
            for (NSNumber * num3 in thirdArr) {
                if ([num1 isEqualToNumber:num2]||[num2 isEqualToNumber:num3]) {
                    count++;
                }
            }
        }
    }
    return count;
}


#pragma mark-----十一选五(算法)
/*
 * 任选复式
 * type：任选复式类型
 * CCombination(所选球的个数,type )
 */
+(int)GetOptional_DoubleWithType:(Type_Optional_Double)type andN:(int)n{
    return CCombination(n, type);
}

/*
 * 任选胆拖
 * TMcode:拖码的个数
 * DMcode:胆码的个数
 * CCombination(拖码的个数,type-胆码的个数)
 *
 */
+(int)GetOptional_DuplexWithType:(Type_Optional_Duplex)type andTMcode:(int)TMcode andDMcode:(int)DMcode{
    return CCombination(TMcode, type-DMcode);
}

/*
 * 前一
 * 注数=所选号码的个数
 * num:所选球的个数
 */
+(int)Get_Before_OneWithNum:(int)num{
    return num;
}
/*
 * 不定胆
 * num:所选球的个数
 */
+(int)Get_Unsure_DanWithNum:(int)num{
    return num;
}
#pragma 前二系列
/*
 * 前二
 * 直选复式
 *
 */
+(int)Get_Before_Two_DirectDoubleWithFirstArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr{
  
    int count=0;
    for (NSNumber * num1 in firstArr) {
        for ( NSNumber * num2 in secondArr) {
            if (![num1 isEqualToNumber:num2]) {
                
                count++;
            }
        }
    }
    return count;
// return   [Tool CCombinationWithN:countA andM:1]*[Tool CCombinationWithN:countB andM:1]
//        -[Tool GetSameNuminFirestArr:firstArr andSecondArr:secondArr];
    
}

/*
 * 前二
 * 直选组合
 * num:所选球的个数
 */
+(int)Get_Before_Two_DirectCombinationWithNum:(int)num{
    return ACombination(num, 2);
}

/*
 * 前二
 * 直选胆拖
 *
 */
+(int)Get_Before_Two_DirectDTWithTMcode:(int)TMcode{
    return CCombination(TMcode, 1)*ACombination(2, 3);
}

/*
 * 前二
 * 组选复式
 *
 */
+(int)Get_Before_Two_GroupDoubleWithNum:(int)num{
    return CCombination(num, 2);
}

/*
 * 前二
 * 组选胆拖
 *
 */
+(int)Get_Before_Two_GroupDTWithTMcode:(int)TMcode{
    return CCombination(TMcode, 1);
}

/*
 * 前二
 * 所有单式玩法
 * 注数=空格隔开的号码个数
 */
+(int)Get_Before_Two_SimplexWithArr:(NSArray *)arr{
    
    return (int)arr.count;
    
}


#pragma 前三系列
/*
 * 前三
 * 直选复式
 *
 */
+(int)Get_Before_Three_DirectDoubleWithFirstArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr andThirdArr:(NSArray *)thirdArr{
    
    int  count =0;
    /*
     * 方法一
     */
    for (NSNumber * num1 in firstArr) {
        for ( NSNumber * num2 in secondArr) {
            for ( NSNumber * num3 in thirdArr) {
                if (![num1 isEqualToNumber:num2]) {//num1=num2=num3
                    if (![num3 isEqualToNumber:num2]) {
                        if (![num3 isEqualToNumber:num1]) {
                            count++;

//                            NSLog(@"%@- %@- %@",num1,num2,num3);
                        }
                    }
                }
            }
        }
    }
    return count;
    
    

    
    /*
     * 方法二
     */
//    int countA=(int)firstArr.count;
//    int countB=(int)secondArr.count;
//    int countC=(int)thirdArr.count;
//    
//    return CCombination(countA, 1)*
//           CCombination(countB, 1)*
//           CCombination(countC, 1)
//    
//          -countC*SameArr(firstArr,secondArr)
//          -countB*SameArr(firstArr,thirdArr)
//          -countA*SameArr(thirdArr,secondArr)
//    
//          +2*SameArrS(firstArr, secondArr, thirdArr);
    


    

}

/*
 * 前三
 * 直选组合
 *
 */
+(int)Get_Before_Three_DirectCombinationWithNum:(int)num{
    return ACombination(num, 3);
}

/*
 * 前三
 * 直选胆拖
 *
 */
+(int)Get_Before_Three_DirectDTWithTMcode:(int)TMcode andDMcode:(int)DMcode{
    return CCombination(TMcode, 3-DMcode)*ACombination(3, 3);
}

/*
 * 前三
 * 组选复式
 *
 */
+(int)Get_Before_Three_GroupDoubleWithNum:(int)num{
    return CCombination(num, 3);
}

/*
 * 前三
 * 组选胆拖
 *
 */
+(int)Get_Before_Three_GroupDTWithTMcode:(int)TMcode andDMcode:(int)DMcode{
    
    return CCombination(TMcode, 3-DMcode);
    
}

/*
 * 前三
 * 所有单式玩法
 * 注数=空格隔开的号码个数
 */
+(int)Get_Before_Three_SimplexWithArr:(NSArray *)arr{
    return (int)arr.count;
    
}

/*
 * 定位胆
 */
+(int)Get_LocationDWithFirstArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr andThirdArr:(NSArray *)thirdArr{
    return (int)(firstArr.count+secondArr.count+thirdArr.count);
}


/*
 * 任选单式
 *
 * 注数=空格隔开的号码个数
 */
+(int)Get_SimplexWithArr:(NSArray *)arr{
    
    return (int)arr.count;
    
}


#pragma mark==================================重庆时时彩====================================

/*
 * 五星
 * 直选复式
 * 注数 =CCombination(Arr1.count,1)
 *CCombination(Arr2.count,1)
 *CCombination(Arr3.count,1)
 *CCombination(Arr4.count,1)
 *CCombination(Arr5.count,1)
 */
+(int)Get_Star_Five_DirectDoubleWithFirstArr:(NSArray *)firstArr andSecondArr:(NSArray *)secondArr andThirdArr:(NSArray *)thirdArr andFourthArr:(NSArray *)fourthArr andFifthArr:(NSArray *)fifthArr{
    int countA=(int)firstArr.count;
    int countB=(int)secondArr.count;
    int countC=(int)thirdArr.count;
    int countD=(int)fourthArr.count;
    int countE=(int)fifthArr.count;
    
    return CCombination(countA, 1)
          *CCombination(countB, 1)
          *CCombination(countC, 1)
          *CCombination(countD, 1)
          *CCombination(countE, 1);
}



@end




















